package org.example.message_queue.mqserver.core;

import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;

/*
*要传递的消息
* 1.属性部分 BasicPropertise
* 2.正文部分 Byte[]
*
* Message对象需要进行网络传输，并写入文件中
* 因此，需要对Message进行序列化和反序列化操作 ---》 implements Serializable（不需要重写）
*/
public class Message implements Serializable {
//    message核心部分
    private BasicProperties basicProperties = new BasicProperties();
    private byte[] body;
//    辅助属性
//    去确定文件具体位置  --  偏移量
//    消息数据的开头举例文件开头的位置偏移量
//    这两个变量不需要被序列化  关键字 --> transient
    private transient long offsetBeg = 0;
    private transient long offsetEnd = 0;
//    消息是否有效
//    0x1--有效  0x0--无效
    private byte isValid = 0x1;

//    【创建一个工厂方法，让工厂方法封装创建Message对象】
//    这个Message对象，自动生成唯一的MessageId
//    假如routingKey和basicProperties中的routingKey发生冲突，则首选外面的routingKey
    public static Message createMessageByWithId(String routingKey,BasicProperties basicProperties,byte[] body) {
        Message message = new Message();
        if (basicProperties != null){
            message.setBasicProperties(basicProperties);
        }
        message.setMessageId("M-"+ UUID.randomUUID());
        message.setRoutingKey(routingKey);
        message.setBody(body);
//        这里的message先把basicProperties和body（核心）先设置出来，其他后面再说
        return message;
    }

    public String getMessageId(){
        return basicProperties.getMessageId();
    }


    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }

    public int getDeliverMode() {
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(int deliverMode) {
        basicProperties.setDeliverMode(deliverMode);
    }

    public BasicProperties getBasicProperties() {
        return basicProperties;
    }

    public void setBasicProperties(BasicProperties basicProperties) {
        this.basicProperties = basicProperties;
    }

    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }

    public long getOffsetBeg() {
        return offsetBeg;
    }

    public void setOffsetBeg(long offsetBeg) {
        this.offsetBeg = offsetBeg;
    }

    public long getOffsetEnd() {
        return offsetEnd;
    }

    public void setOffsetEnd(long offsetEnd) {
        this.offsetEnd = offsetEnd;
    }

    public byte getIsValid() {
        return isValid;
    }

    public void setIsValid(byte isValid) {
        this.isValid = isValid;
    }

    @Override
    public String toString() {
        return "Message{" +
                "basicProperties=" + basicProperties +
                ", body=" + Arrays.toString(body) +
                '}';
    }
}
